函数所需的大量堆栈空间会阻止它被内联吗?例如,如果我在堆栈上有一个10k的自动缓冲区,是否会降低函数被内联的可能性?intinlineme(intargs){charsvar[10000];returnstringyfunc(args,svar);}我更关心gcc,但icc和llvm也很高兴知道。我知道这并不理想,但我很好奇。代码在缓存上也可能很糟糕。 最佳答案 是的,内联与否取决于函数的复杂性、堆栈和寄存器的使用情况以及进行调用的上下文。这些规则依赖于编译器和目标平台。当性能很重要时,请始终检查生成的程序集。比较thisversi
我最近开始制作GTK+的C++包装器(没有什么特别的,只是将所有东西包装到C++类中以便于开发,供内部使用)并且对已经慢Gtk+我几乎在任何地方都使用了内联函数。看看几个类函数...classWidget:publicObject{public://Afewsamplefunctions.gwidgetistheinternalGTK+widget.voidShow(void){gtk_widget_show(GTK_WIDGET(gwidget));}voidShowNow(void){gtk_widget_show_now(GTK_WIDGET(gwidget));}voidHid
我事先知道,在用C或C++编写程序时,即使我将函数声明为“内联”,编译器也可以随意忽略它并决定不在每次(或任何)调用时扩展它。反之亦然吗?也就是说,如果编译器认为这样做会带来性能提升,那么编译器是否可以自动内联未定义为内联的非常短的函数?另外两个子问题:此行为是否在ANSI标准的某处定义?在这方面,C与C++是不同的,还是它们的行为相同? 最佳答案 inline对于函数是否会被编译器内联没有约束力。这本来就是它打算做的。但从那时起,人们意识到函数是否值得内联取决于函数本身和调用站点,最好由编译器来决定。来自https://en.cp
我正在研究C++中的内联函数,并且已经谈到了有关其使用限制的部分。它说:Thecompileralsocannotperforminliningiftheaddressofthefunctionistakenimplicitlyorexplicitly.有人可以向我解释一下,或许可以举个例子,这到底是什么意思? 最佳答案 您可以将任何函数标记为内联。即使是一个虚函数,甚至是递归函数,甚至是一个非常长的函数,即使它的地址被占用。内联函数和非内联函数的主要区别在于前者的定义必须出现在使用它的每个翻译单元(又名源文件)中(这就是为什么内联
我有一个以下列方式声明的类:#ifndefMYCLASS_H#defineMYCLASS_HclassMyClass:publicMyOtherClass{public:MyClass();inta()const{return_a;};intb()const{return_b;};private:int_a;int_b;};inlinebooloperator==(constMyClass&lhs,constMyClass&rhs){return(lhs.a()==rhs.a())&&(lhs.b()==rhs.b());}#endif我的问题是在重载的operator==中设置的任何
我目前遇到g++问题警告我无法摆脱。我的代码运行良好,但此警告不断弹出:ChildModel.h:136:24:warning:inlinefunctionvirtualintChildModel::getLinkCost(constLink&)constusedbutneverdefined[enabledbydefault]我目前找到了thispost在S.O上,有同样的问题,但答案是特定于库的(定义了一些东西)所以它对我不起作用。我的代码如下:classModel{public:virtualinlineintgetLinkCost(Linkconst&link)const;};
假设我有这段代码(不要介意SecondsToMinutes和MinutesToHours是彼此的拷贝这一事实)inlinefloatSecondsToMinutes(floatseconds){returnseconds/60.0;}inlinefloatMinutesToHours(floatminutes){returnminutes/60.0;}inlinefloatHoursToDays(floatminutes){returnminutes/24.0;}inlinefloatSeconndsToHours(floatseconds){returnMinutesToHours(
我正在使用这个例子来初始化boolvector:#include#include#includeusingnamespacestd;intmain(){map>myMap;vectorone{true,true,false};myMap[2]=one;cout我在此代码中所做的唯一更改是使用std::vector而不是vector,我现在拥有:std::map>m_links;std::vectorm_allFalse{false,false,false,false,false};它告诉我在m_allFalse之后使用;。我怎样才能摆脱这个错误?我使用的是intel编译器14,但没有c
我刚刚了解到,在类的头文件中定义一个C++函数会使该函数内联。但我知道将inline关键字放在函数旁边只是一个建议,编译器不一定会遵循它。这对于header定义的C++函数是否相同?独立C++函数和作为类一部分的C++函数在行为上是否存在差异? 最佳答案 “在类的头文件中定义一个c++函数使函数内联”那不是真的。在类定义中定义一个函数(也就是说,提供函数体而不只是一个声明)使其成为内联的。通过“使其内联”,我的意思是它与给它inline关键字相同。但是类定义不必在标题中,标题可以包含类定义以外的其他内容。所以在这个例子中,函数foo
如果我在头文件中定义了一个非成员函数,它会一直被编译器内联,还是编译器会根据其启发式方法进行选择?我知道__inline只是一个提示,它与标题中的函数一样吗? 最佳答案 请记住,在标题中包含某些内容与直接在源文件中键入内容没有什么不同。因此,就编译器而言,位于header中没有区别;它从来不知道它在那里。因此,当您在头文件中定义一个函数,并将该头文件包含在一个文件中时,就好像您直接将函数键入到文件中一样。所以现在的问题是,“编译器是否选择基于启发式内联事物?”答案是“这取决于编译器”。该标准不保证内联或不内联的内容。也就是说,任何现